package testJdk.base.juc_test.multi_threading;

/**
 * @author Created by cyd on 2021-03-26 11:43:01
 * @Description : 多线程学习验证
 * 1.创建一个线程01，这个线程读取到initFlag，依据这个flag的值，决定是否做死循环
 * 2.主线程睡眠2秒，确保子线程01开启
 * 3.创建子线程02，更改initFlag的值
 * 期望的结果：
 * 等待数据
 * 正在准备数据。。。
 * 数据准备完毕
 * -----------success
 * 但是结果却不满足，说明线程02并没有改变线程01的initFlag
 */
public class VolatileVisibilityTest {
    private static volatile boolean initFlag = false;

    //private static boolean initFlag = false;

    public static void main(String[] args) throws InterruptedException {

        new Thread(() -> {
            System.out.println("等待数据");
            // 死循环
            while (!initFlag) {
            }
            System.out.println("-----------success");
        }).start();
        // 主线程睡眠2秒，确保等待线程开启
        Thread.sleep(2000);

        // 新开一个线程，改变initFlag的值
        new Thread(() -> prepareData()).start();
    }

    private static void prepareData() {
        System.out.println("正在准备数据。。。");
        initFlag = true;
        System.out.println("数据准备完毕");
    }
}
